//
// Created by wopy on 2020/8/31.
//

#ifndef FCITX_FCITXBIHUAINPUTMETHOD_INPUTSTATE_HPP
#define FCITX_FCITXBIHUAINPUTMETHOD_INPUTSTATE_HPP

#include "Table.hpp"

class InputState {
private:
    InputState() = default; //隐藏无参构造函数

    FcitxInstance *owner;   //fcitx全局接口
    std::string lastInput;  //最后输入內容
    FcitxInputState *fcitxInputState;   //fcitx输入状态
    Table *core;    //键码表
    Table *thesaurus;   //扩展词典
public:
    /***
     * 从Fcitx全局接口构造InputState
     * @param owner Fcitx全局接口
     */
    InputState(FcitxInstance *owner);

    /***
     * 构析函数
     */
    ~InputState();

    /***
     * 获取Fcitx接口
     * @return  Fcitx全局接口
     */
    FcitxInstance *getInstance();

    /***
     * 获取Fcitx输入状态
     * @return  Fcitx输入状态
     */
    FcitxInputState *getFcitxInputState();

    /***
     * 检验是否存在最后输入
     * @return  lastInput变量是否为空
     */
    bool hasLastInput();

    /***
     * 清除最后输入
     */
    void cleanLastInput();

    /***
     * 添加数据到最后输入
     * @param word  输入的数据
     */
    void appendLastInput(const string& word);

    /***
     * 在候选栏上显示消息
     * @param msg   要显示的消息
     */
    void setMessage(const string& msg);

    /***
     * 从键码获得候选词
     * @param dstList   Fcitx候选词表
     * @param keyCode   键码
     */
    void getCandidateWord(FcitxCandidateWordList *dstList, const char *keyCode);

    /***
     * 获取联想词表
     * @param word  要联想的词
     * @return  下一步动作
     */
    INPUT_RETURN_VALUE getRemindCandWordList(const char *word);

    /***
     * 获取一个空的Fcitx候选词表
     * @return  Fcitx候选词表
     */
    FcitxCandidateWordList * getWordListAsZero();

    /***
     * 联想词上屏的外部调用
     * @param arg 输入法状态
     * @param candWord 要上屏的词
     * @return
     */
    static INPUT_RETURN_VALUE onRemindCandWord(void *arg, FcitxCandidateWord *candWord);

    /***
     * 联想词上屏的内部调用
     * @param candWord 要上屏的词
     * @return 后继动作类型
     */
    INPUT_RETURN_VALUE onRemindCandWord(FcitxCandidateWord *candWord);

    /***
     * 字上屏的外界调用
     * @param arg       输入法状态
     * @param candWord  要上屏的字
     * @return          后继动作类型
     */
    static INPUT_RETURN_VALUE onCandWord(void *arg, FcitxCandidateWord *candWord);

    INPUT_RETURN_VALUE onCandWord(FcitxCandidateWord *candWord);

    void upper(char *word);

};

extern bool matchKeyCode(const char *src, const char *dest);
#endif //FCITX_FCITXBIHUAINPUTMETHOD_INPUTSTATE_HPP
